package com.semac.client.paginas.chamada;

import java.util.ArrayList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.semac.client.aplicacao.AplicacaoController;
import com.semac.client.aplicacao.Pagina;
import com.semac.client.aplicacao.PaginasController;
import com.semac.client.componentes.atividadestable.AtividadeCellTable;
import com.semac.client.componentes.atividadestable.AtividadeCellTableDeleteEvent;
import com.semac.client.componentes.atividadestable.AtividadeCellTableEventHandler;
import com.semac.client.componentes.atividadestable.AtividadeCellTableInscreveEvent;
import com.semac.client.componentes.atividadestable.AtividadeCellTableSelectEvent;
import com.semac.client.componentes.listafrequencia.PresencaEvent;
import com.semac.client.componentes.listafrequencia.PresencaHandler;
import com.semac.client.componentes.listafrequencia.PresencaTable;
import com.semac.client.componentes.loading.Loading;
import com.semac.client.rpc.AtividadeRPCServices;
import com.semac.client.rpc.ChamadaRPCService;
import com.semac.client.rpc.RPCCallBackWrapper;
import com.semac.client.rpc.SemanacRPCService;
import com.semac.shared.model.Atividade;
import com.semac.shared.model.Presenca;
import com.semac.shared.model.SemanaAcademica;

public class ChamadaUI extends Composite implements Pagina, AtividadeCellTableEventHandler, PresencaHandler {

	private static ChamadaUIUiBinder uiBinder = GWT.create(ChamadaUIUiBinder.class);
	@UiField(provided=true) AtividadeCellTable atividadeCellTable = new AtividadeCellTable();
	@UiField Loading loading;
	@UiField PresencaTable listaDeChamada;
	@UiField Label statusLabel;
	@UiField Label semanaAcademicaNameLabel;
	private SemanaAcademica semanaAtiva;

	private Atividade atividadeSeleciona;
	
	interface ChamadaUIUiBinder extends UiBinder<Widget, ChamadaUI> {
	}

	public ChamadaUI() {
		initWidget(uiBinder.createAndBindUi(this));
		this.atividadeCellTable.addAtividadeSelecionadaHandler(this);
		this.atividadeCellTable.configuraPermissoes(false, false);
		listaDeChamada.addPresencaEventHandler(this);
		this.pegaSemanaAtiva();
	}

	
	private void pegaSemanaAtiva() {
		SemanacRPCService.Util.getInstance().pegaSemanaAcademicaAtiva(new RPCCallBackWrapper<SemanaAcademica>(this.loading,true) {

			@Override
			public void gotResult(SemanaAcademica result) {
				semanaAtiva = result;
				if (semanaAtiva != null){
					semanaAcademicaNameLabel.setText(semanaAtiva.getDescricao());
					populaAtividades();
				}
				
			}
		});
	}
	
	
	
	@Override
	public String getValorHistoryToken() {
		return PaginasController.CHAMADA;
	}

	@Override
	public Widget getView() {
		return this;
	}
	
	
	private void populaAtividades() {
		Atividade filtro = new Atividade();
		filtro.setCodSemac(semanaAtiva.getCodSemana());
		filtro.addMinistrante(AplicacaoController.getPessoaLogada());
		AtividadeRPCServices.Util.getInstance().selecionaAtividadesLike(filtro, true, new RPCCallBackWrapper<ArrayList<Atividade>>(this.loading,true) {
			@Override
			public void gotResult(ArrayList<Atividade> result) {				
				atividadeCellTable.setRowData(result);
			}
		});
	}

	
	private void populaChamada(Atividade atividadeSelecionada) {
		ChamadaRPCService.Util.getInstance().getPessoasInscritas(atividadeSelecionada, new RPCCallBackWrapper<ArrayList<Presenca>>(this.loading,true) {
			@Override
			public void gotResult(ArrayList<Presenca> result) {
				listaDeChamada.clear();
				statusLabel.setText("");
				listaDeChamada.addListaDeInscritos(result);
			}
		});
	}
	
	
	@Override
	public void onAtividadeSelect(AtividadeCellTableSelectEvent event) {
		this.atividadeSeleciona = event.getAtividade();
		this.populaChamada(this.atividadeSeleciona );
	}
	
	

	@Override
	public void onAtividadeDelete(AtividadeCellTableDeleteEvent event) {
	}

	@Override
	public void onAtividadeInscreve(AtividadeCellTableInscreveEvent event) {
	}


	@Override
	public void onPresencaChange(PresencaEvent event) {
		ChamadaRPCService.Util.getInstance().salvaPresenca(event.getPresenca(), new RPCCallBackWrapper<String>(this.loading,true) {
			@Override
			public void gotResult(String result) {
				statusLabel.setText(result);
			}
		});
	}

}
